package main

import "fmt"

type Person struct {
	name string
	age  int
}

// 方法
func main() {

	//方法是作用于特定类型的函数，这种特定的变量我们叫做接收者，接受者的概念就类似于其他语言的this和self
	//方法定义的格式
	//func(接收者变量，接收者类型) 方法名 (参数列表)(返回值){//函数体}
	//接收者变量：接收者中的参数变量在命名时，官方建议使用接收者类型名的第一个小写字母，而不是self和this之类的
	//接收者类型：接收者类型和参数类似，可以用指针和非指针类型
	//方法名，参数列表，返回参数，具体格式与函数定义相同
	person1 := NewPerson("曾宇杰", 22)
	person1.Dream()
	fmt.Println(person1.name) //

}

// NewPerson构造函数
func NewPerson(name string, age int) *Person {
	return &Person{name, age}
}

// 定义Person的方法
func (p Person) Dream() {
	fmt.Println(p.name + "要学好go语言")
	p.name = "曾大大" //如果接受者是 p Person 就是值传递，如果接收者是p *Preson是引用传递
}

//如果非本地类型不能定义方法，也就是说不能给其他包的类型定义方法

//方法允许范围控制的规则，和函数一样，方法名首字母小写，只能在本包中访问，方法首字母大写，可以在本包和其他包中访问

//如果一个类型实现了string()这个方法，那么fmt.println()默认会调用这个变量的string()方法进行输出
